#include<iostream>
using namespace std;
#include<pthread.h>
#include<unistd.h>

//创建互斥锁和条件变量
pthread_mutex_t mtx;
pthread_cond_t con;

//主线程唤醒条件变量下等待的线程
void* ctrl(void* args)
{
    const char* master=(const char*)args;
    while(true)
    {
        cout<< "master say :begin work"<<endl;
        //一次唤醒1个线程
       // pthread_cond_signal(&con);

        //一次唤醒3个线程
        //pthread_cond_broadcast(&con);
        sleep(5);
    }

}

//分线程在条件变量下等待
void* work(void* args)
{
    int number=*(int*)args;
    while(true)
    {
        pthread_cond_wait(&con,&mtx);
        cout<<"我是 "<<number<<"号线程"<<endl; 
    }
}


int main()
{
#define NUM 3
    //锁和条件变量的初始化
    pthread_mutex_init(&mtx,nullptr);
    pthread_cond_init(&con,nullptr);

    //创建主线程
    pthread_t master;
    pthread_create(&master,nullptr,ctrl,(void*)master);

    //创建分线程
    pthread_t worker[NUM];
    for(int i=0;i<NUM;i++)
    {
        int* number=new int(i);
        pthread_create(worker+i,nullptr,work,(void*)number);
    }
    
    //线程等待
    for(int i=0;i<NUM;i++)
    {
        pthread_join(worker[i],nullptr);
    }
    pthread_join(master,nullptr);

    //锁和条件变量的销毁
    pthread_mutex_destroy(&mtx);
    pthread_cond_destroy(&con);

    return 0;
}
